package com.wande.dataplatform.filecollection.validation;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import jakarta.annotation.PostConstruct;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 校验规则注册表
 * 管理所有校验规则的注册和获取
 *
 * @author wande
 */
@Slf4j
@Component
public class ValidationRuleRegistry {

    /**
     * 校验规则映射表
     * key: 规则类型, value: 校验规则实例
     */
    private final Map<String, IValidationRule> ruleMap = new ConcurrentHashMap<>();

    @Autowired(required = false)
    private List<IValidationRule> validationRules;

    /**
     * 初始化，自动注册所有校验规则
     */
    @PostConstruct
    public void init() {
        if (validationRules != null) {
            for (IValidationRule rule : validationRules) {
                registerRule(rule);
            }
        }
        log.info("校验规则注册完成，共注册 {} 个规则", ruleMap.size());
    }

    /**
     * 注册校验规则
     *
     * @param rule 校验规则
     */
    public void registerRule(IValidationRule rule) {
        String ruleType = rule.getRuleType();
        if (ruleMap.containsKey(ruleType)) {
            log.warn("校验规则 {} 已存在，将被覆盖", ruleType);
        }
        ruleMap.put(ruleType, rule);
        log.info("注册校验规则: {}", ruleType);
    }

    /**
     * 获取校验规则
     *
     * @param ruleType 规则类型
     * @return 校验规则，如果不存在返回null
     */
    public IValidationRule getRule(String ruleType) {
        return ruleMap.get(ruleType);
    }

    /**
     * 检查规则是否存在
     *
     * @param ruleType 规则类型
     * @return 是否存在
     */
    public boolean hasRule(String ruleType) {
        return ruleMap.containsKey(ruleType);
    }

    /**
     * 获取所有已注册的规则类型
     *
     * @return 规则类型列表
     */
    public List<String> getAllRuleTypes() {
        return List.copyOf(ruleMap.keySet());
    }

    /**
     * 获取所有已注册的规则
     *
     * @return 规则列表
     */
    public List<IValidationRule> getAllRules() {
        return List.copyOf(ruleMap.values());
    }
}
